www.gusucode.com > VC++ GDI+仿QQ日历, > VC++ GDI+仿QQ日历,/gusucode/src/TXBarDlg.cpp
//Download by http://www.NewXing.com // TXBarDlg.cpp : implementation file // #include "stdafx.h" #include "TXBar.h" #include "TXBarDlg.h" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTXBarDlg dialog CTXBarDlg::CTXBarDlg(CWnd* pParent /*=NULL*/) : CDialog(CTXBarDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTXBarDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 rcTool[0].X = 59; rcTool[0].Y = 45; rcTool[0].Width = 24; rcTool[0].Height = 24; rcTool[1].X = 95; rcTool[1].Y = 45; rcTool[1].Width = 24; rcTool[1].Height = 24; rcTool[2].X = 131; rcTool[2].Y = 45; rcTool[2].Width = 24; rcTool[2].Height = 24; rcTool[3].X = 167; rcTool[3].Y = 45; rcTool[3].Width = 24; rcTool[3].Height = 24; rcTool[4].X = 203; rcTool[4].Y = 45; rcTool[4].Width = 24; rcTool[4].Height = 24; rcTool[5].X = 239; rcTool[5].Y = 45; rcTool[5].Width = 24; rcTool[5].Height = 24; rcBack[0].X = 59; rcBack[0].Y = 45; rcBack[0].Width = 24; rcBack[0].Height = 24; rcBack[1].X = 95; rcBack[1].Y = 45; rcBack[1].Width = 24; rcBack[1].Height = 24; rcBack[2].X = 131; rcBack[2].Y = 45; rcBack[2].Width = 24; rcBack[2].Height = 24; rcBack[3].X = 167; rcBack[3].Y = 45; rcBack[3].Width = 24; rcBack[3].Height = 24; rcBack[4].X = 203; rcBack[4].Y = 45; rcBack[4].Width = 24; rcBack[4].Height = 24; rcBack[5].X = 239; rcBack[5].Y = 45; rcBack[5].Width = 24; rcBack[5].Height = 24; for(int i=0;i<6;i++) { rcRange[i].left = 53+i*36; rcRange[i].top = 40; rcRange[i].right = 53+(i+1)*36; rcRange[i].bottom = 45+5+5+24; } m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTXBarDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTXBarDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTXBarDlg, CDialog) //{{AFX_MSG_MAP(CTXBarDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_ERASEBKGND() ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() ON_WM_TIMER() ON_WM_LBUTTONUP() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTXBarDlg message handlers BOOL CTXBarDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here RECT r; GetClientRect(&r); SetWindowPos(&wndTopMost, r.left, r.top, r.right, r.bottom, SWP_NOOWNERZORDER); hFuncInst = LoadLibrary("User32.DLL"); BOOL bRet=FALSE; if(hFuncInst) UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst, "UpdateLayeredWindow"); else { AfxMessageBox("User32.dll ERROR!"); exit(0); } //初始化gdiplus的环境 // Initialize GDI+. m_Blend.BlendOp=0; //the only BlendOp defined in Windows2000 m_Blend.BlendFlags=0; //nothingelseisspecial... m_Blend.AlphaFormat=1; //... m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA DrawTXBar(); //去除任务栏窗口对应按钮 ModifyStyleEx (WS_EX_APPWINDOW,WS_EX_TOOLWINDOW ); return TRUE; // return TRUE unless you set the focus to a control } void CTXBarDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CTXBarDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CTXBarDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } BOOL CTXBarDlg::OnEraseBkgnd(CDC* pDC) { pDC->SetBkMode(TRANSPARENT); return TRUE; } void CTXBarDlg::OnButton1() { // TODO: Add your control notification handler code here } void CTXBarDlg::DrawTXBar() { HDC hdcTemp=GetDC()->m_hDC; m_hdcMemory=CreateCompatibleDC(hdcTemp); HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,400,300); SelectObject(m_hdcMemory,hBitMap); HDC hdcScreen=::GetDC (m_hWnd); RECT rct; GetWindowRect(&rct); POINT ptWinPos={rct.left,rct.top}; Graphics graphics(m_hdcMemory); RECT rcClient; GetClientRect(&rcClient); Image m_Title(L"toolbarbktop.png"); graphics.DrawImage(&m_Title,Rect(rcClient.left+50,rcClient.top,m_Title.GetWidth(),m_Title.GetHeight())); Image m_ToolBK(L"toolbarbkbottom.png"); graphics.DrawImage(&m_ToolBK,Rect(rcClient.left+50,rcClient.top+m_Title.GetHeight()-4,m_Title.GetWidth(),m_ToolBK.GetHeight())); if(rcTool[0].Width < 36) { Image m_Tool0(L"intomain_24.png"); graphics.DrawImage(&m_Tool0,rcTool[0]); } else { Image m_Tool0_1(L"intomain_48.png"); graphics.DrawImage(&m_Tool0_1,rcTool[0]); } if(rcTool[1].Width <36) { Image m_Tool1(L"intomini_24.png"); graphics.DrawImage(&m_Tool1,rcTool[1]); } else { Image m_Tool1_1(L"intomini_48.png"); graphics.DrawImage(&m_Tool1_1,rcTool[1]); } if(rcTool[2].Width < 36) { Image m_Tool2(L"todolist_24.png"); graphics.DrawImage(&m_Tool2,rcTool[2]); } else { Image m_Tool2_1(L"todolist_48.png"); graphics.DrawImage(&m_Tool2_1,rcTool[2]); } if(rcTool[3].Width < 36) { Image m_Tool3(L"mini_newevent_small.png"); graphics.DrawImage(&m_Tool3,rcTool[3]); } else { Image m_Tool3_1(L"newevent_big.png"); graphics.DrawImage(&m_Tool3_1,rcTool[3]); } if(rcTool[4].Width < 36) { Image m_Tool4(L"setting_24.png"); graphics.DrawImage(&m_Tool4,rcTool[4]); } else { Image m_Tool4_1(L"setting_48.png"); graphics.DrawImage(&m_Tool4_1,rcTool[4]); } if(rcTool[5].Width < 36 ) { Image m_Tool5(L"exit_24.png"); graphics.DrawImage(&m_Tool5,rcTool[5]); } else { Image m_Tool5_1(L"exit_48.png"); graphics.DrawImage(&m_Tool5_1,rcTool[5]); } /* Pen pen(Color(255,21,164,208),1); for(int i =0;i<6;i++) { Rect rcTemp; rcTemp.X = rcRange[i].left; rcTemp.Y = rcRange[i].top; rcTemp.Width = rcRange[i].right - rcRange[i].left; rcTemp.Height = rcRange[i].bottom - rcRange[i].top; graphics.DrawRectangle(&pen,rcTemp); }*/ SIZE sizeWindow={400,300}; POINT ptSrc={0,0}; DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE); if((dwExStyle&0x80000)!=0x80000) SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000); BOOL bRet=FALSE; bRet= UpdateLayeredWindow( m_hWnd,hdcScreen,&ptWinPos, &sizeWindow,m_hdcMemory,&ptSrc,0,&m_Blend,2); graphics.ReleaseHDC(m_hdcMemory); ::ReleaseDC(m_hWnd,hdcScreen); hdcScreen=NULL; ::ReleaseDC(m_hWnd,hdcTemp); hdcTemp=NULL; DeleteObject(hBitMap); DeleteDC(m_hdcMemory); m_hdcMemory=NULL; } void CTXBarDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default POINT pt; pt.x = point.x; pt.y = point.y; int nBack; for(int i=0;i<6;i++) { if(PtInRect(&(rcRange[i]),pt)) { rcTool[i].X = rcBack[i].X+rcBack[i].Width/2-24+((rcBack[i].X+rcBack[i].Width/2)-point.x); // rcTool[i].Y = rcBack[i].Y; rcTool[i].Width = 48; rcTool[i].Height = 48; nBack = (rcRange[i].right - rcRange[i].left)/2; //区域宽度备份/2 rcRange[i].left = rcTool[i].X - 12; rcRange[i].top = rcTool[i].Y; rcRange[i].right = rcTool[i].X - 12+72; rcRange[i].bottom = rcTool[i].Y+53; /* for(int m= 0;m<6;m++) { if(m > i) { rcTool[m].X = rcTool[i].X+66+(m-i-1)*36; rcTool[m].Y = rcTool[m].Y; rcTool[m].Width = 24; rcTool[m].Height = 24; rcRange[m].left = rcTool[m].X - 6; rcRange[m].top = rcTool[m].Y; rcRange[m].right = rcTool[m].X +30; rcRange[m].bottom = rcTool[m].Y+53; } else if(m < i) { rcTool[m].X = rcTool[i].X-12+(m-i)*36+6; rcTool[m].Y = rcTool[m].Y; rcTool[m].Width = 24; rcTool[m].Height = 24; rcRange[m].left = rcTool[m].X - 6; rcRange[m].top = rcTool[m].Y; rcRange[m].right = rcTool[m].X - 6+36; rcRange[m].bottom = rcTool[m].Y+53; } }*/ /* int nLen = 66; int x = point.x - (rcTool[i].X+24); int nN = GetMoreInt(x,36); for(int m=i+1;m<6;m++) { rcTool[m].X = rcTool[i].X+nLen; rcTool[m].Y = rcTool[m].Y; if((m-i) == 1) { rcTool[m].Width = 36+nN; rcTool[m].Height = 36+nN; nLen += rcTool[m].Width+12; } else if( (m-i) == 2) { if((24+nN)>24) { rcTool[m].Width = 24+nN; rcTool[m].Height = 24+nN; } else { rcTool[m].Width = 24; rcTool[m].Height = 24; } nLen += rcTool[m].Width +12; } else { rcTool[m].Width = 24; rcTool[m].Height = 24; nLen += 24+12; } rcRange[m].left = rcTool[m].X - 6; rcRange[m].top = rcTool[m].Y-5; rcRange[m].right = rcTool[m].X + rcTool[m].Width+6; rcRange[m].bottom = rcTool[m].Y+ rcTool[m].Height +5; } nLen = 0; for(int k=i;k>=0;k--) { if(k != i) { if((i-k) == 1) { rcTool[k].Width = 36-nN; rcTool[k].Height = 36-nN; nLen += rcTool[k].Width+18; } else if( (i-k) == 2) { if((24-nN)>24) { rcTool[k].Width = 24-nN; rcTool[k].Height = 24-nN; } else { rcTool[k].Width = 24; rcTool[k].Height = 24; } nLen += rcTool[k].Width +12; } else { rcTool[k].Width = 24; rcTool[k].Height = 24; nLen += 24+12; } rcTool[k].X = rcTool[i].X-nLen; rcTool[k].Y = rcTool[k].Y; rcRange[k].left = rcTool[k].X - 6; rcRange[k].top = rcTool[k].Y-5; rcRange[k].right = rcTool[k].X + rcTool[k].Width+6; rcRange[k].bottom = rcTool[k].Y+ rcTool[k].Height +5; } }*/ int nLen = 66; int nN = 0; for(int m=i+1;m<6;m++) { if((m-i) == 1) { rcTool[m].X = rcTool[i].X + nLen; rcTool[m].Y = rcTool[m].Y; float ff = ((rcTool[m].X - point.x)/42.0)*36.0; nN = fabs(ff); if(nN > 48) { nN = 48; } else if(nN < 24) { nN = 24; } rcTool[m].Width = nN; rcTool[m].Height = rcTool[m].Width; nLen += rcTool[m].Width +12; } else if((m-i == 2)) { rcTool[m].X = rcTool[i].X + nLen; rcTool[m].Y = rcTool[m].Y; float fb = ((rcTool[m].X - point.x)/90.0)*24.0; nN = fabs(fb); if(nN > 48) { nN = 48; } else if(nN < 24) { nN = 24; } rcTool[m].Width = nN; rcTool[m].Height = rcTool[m].Width; nLen += rcTool[m].Width +12; } else { rcTool[m].X = rcTool[i].X + nLen; rcTool[m].Y = rcTool[m].Y; rcTool[m].Width = 24; rcTool[m].Height = 24; nLen += 36; } rcRange[m].left = rcTool[m].X - 6; rcRange[m].top = rcTool[m].Y-5; rcRange[m].right = rcTool[m].X + rcTool[m].Width+6; rcRange[m].bottom = rcTool[m].Y+ rcTool[m].Height +5; } nLen = 18; for(int k=i;k>=0;k--) { if(k != i) { if((i-k) == 1) { float fc = ((point.x - (rcTool[i].X - nLen))/42.0)*36.0; nN = fabs(fc); if(nN > 48) { nN = 48; } else if(nN < 24) { nN = 24; } rcTool[k].Width = nN; rcTool[k].Height = rcTool[k].Width; rcTool[k].X = rcTool[i].X - nLen - rcTool[k].Width; rcTool[k].Y = rcTool[k].Y; nLen += rcTool[k].Width+12; } else if ((i-k) == 2) { float fd = ((point.x - (rcTool[i].X - nLen))/90.0)*24.0; nN = fabs(fd); if(nN > 48) { nN = 48; } else if(nN < 24) { nN = 24; } rcTool[k].Width = nN; rcTool[k].Height = rcTool[k].Width; rcTool[k].X = rcTool[i].X - nLen - rcTool[k].Width; rcTool[k].Y = rcTool[k].Y; nLen += rcTool[k].Width +12; } else { rcTool[k].Width = 24; rcTool[k].Height = 24; rcTool[k].X = rcTool[i].X - nLen - rcTool[k].Width; rcTool[k].Y = rcTool[k].Y; nLen += 24+12; } rcRange[m].left = rcTool[m].X - 6; rcRange[m].top = rcTool[m].Y-5; rcRange[m].right = rcTool[m].X + rcTool[m].Width+6; rcRange[m].bottom = rcTool[m].Y+ rcTool[m].Height +5; } } DrawTXBar(); SetTimer(1,10,NULL); break; } } CDialog::OnMouseMove(nFlags, point); } void CTXBarDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default POINT pt; pt.x = point.x; pt.y = point.y; CString m_Box; for(int i=0;i<6;i++) { if(PtInRect(&(rcRange[i]),pt)) { m_Box.Format("%d",i); MessageBox(m_Box); break; } } CDialog::OnLButtonDown(nFlags, point); } void CTXBarDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default POINT pt; GetCursorPos(&pt); ScreenToClient(&pt); int k; for(int i = 0 ;i<6;i++) { if(PtInRect(&(rcRange[i]),pt)) { goto label; } } KillTimer(1); rcTool[0].X = 59; rcTool[0].Y = 45; rcTool[0].Width = 24; rcTool[0].Height = 24; rcTool[1].X = 95; rcTool[1].Y = 45; rcTool[1].Width = 24; rcTool[1].Height = 24; rcTool[2].X = 131; rcTool[2].Y = 45; rcTool[2].Width = 24; rcTool[2].Height = 24; rcTool[3].X = 167; rcTool[3].Y = 45; rcTool[3].Width = 24; rcTool[3].Height = 24; rcTool[4].X = 203; rcTool[4].Y = 45; rcTool[4].Width = 24; rcTool[4].Height = 24; rcTool[5].X = 239; rcTool[5].Y = 45; rcTool[5].Width = 24; rcTool[5].Height = 24; for(k=0;k<6;k++) { rcRange[k].left = 53+k*36; rcRange[k].top = 40; rcRange[k].right = 53+(k+1)*36; rcRange[k].bottom = 45+5+5+24; } DrawTXBar(); label: CDialog::OnTimer(nIDEvent); } void CTXBarDlg::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDialog::OnLButtonUp(nFlags, point); } int CTXBarDlg::GetMoreInt(int x, int nBack) { int ret = 0; BOOL bJian = FALSE; if(x < 0) { x = -x; bJian = TRUE; } if(x>=0 && x<(nBack/6)) { ret = 2; } else if((x >= (nBack/6)) && (x < (2*nBack/6))) { ret = 4; } else if((x >= (2*nBack/6)) && (x < (3*nBack/6))) { ret = 6; } else if ((x >= (3*nBack/6)) && (x < (4*nBack/6))) { ret = 8; } else if ((x >= (4*nBack/6)) && (x < (5*nBack/6))) { ret = 10; } else if ((x >= (5*nBack/6)) && (x < (6*nBack/6))) { ret = 12; } else if (x >= (6*nBack/6)) { ret = 12; } if(bJian) { ret = - ret; } return ret; }